#!/bin/bash

##############################################
# DevTools Hub - PM2 部署脚本
# 直接在宿主机上运行（不使用 Docker）
##############################################

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 项目配置
PROJECT_ROOT="/www/devtools-hub"
BACKEND_DIR="${PROJECT_ROOT}/backend"
FRONTEND_DIR="${PROJECT_ROOT}/frontend"
DOMAIN="devtoolsnav.com"

echo -e "${BLUE}"
echo "╔════════════════════════════════════════╗"
echo "║   🚀 DevTools Hub PM2 部署脚本         ║"
echo "║   域名: ${DOMAIN}                      ║"
echo "╚════════════════════════════════════════╝"
echo -e "${NC}"

##############################################
# 第一步：环境检查
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}📋 第一步：环境检查${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

# 检查 Docker
if command -v docker &> /dev/null; then
    DOCKER_VERSION=$(docker -v | cut -d' ' -f3 | sed 's/,//')
    echo -e "${GREEN}✅ Docker 已安装 (${DOCKER_VERSION})${NC}"
else
    echo -e "${RED}❌ Docker 未安装${NC}"
    echo "请先安装 Docker："
    echo "  curl -fsSL https://get.docker.com | sh"
    echo "  sudo usermod -aG docker \$USER"
    exit 1
fi

# 检查 Docker Compose
if command -v docker &> /dev/null && docker compose version &> /dev/null; then
    COMPOSE_VERSION=$(docker compose version | cut -d' ' -f4)
    echo -e "${GREEN}✅ Docker Compose 已安装 (${COMPOSE_VERSION})${NC}"
else
    echo -e "${RED}❌ Docker Compose 未安装${NC}"
    echo "Docker Compose 是 Docker 的一部分，请更新 Docker"
    exit 1
fi

# 检查 Node.js
if command -v node &> /dev/null; then
    NODE_VERSION=$(node -v)
    echo -e "${GREEN}✅ Node.js 已安装 (${NODE_VERSION})${NC}"
else
    echo -e "${RED}❌ Node.js 未安装${NC}"
    echo "请先安装 Node.js 18+ 或 20+："
    echo "  curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -"
    echo "  sudo apt-get install -y nodejs"
    exit 1
fi

# 检查 pnpm
if command -v pnpm &> /dev/null; then
    PNPM_VERSION=$(pnpm -v)
    echo -e "${GREEN}✅ pnpm 已安装 (${PNPM_VERSION})${NC}"
else
    echo -e "${YELLOW}⚠️  pnpm 未安装，正在安装...${NC}"
    npm install -g pnpm
    echo -e "${GREEN}✅ pnpm 安装完成${NC}"
fi

# 检查 PM2
if command -v pm2 &> /dev/null; then
    PM2_VERSION=$(pm2 -v)
    echo -e "${GREEN}✅ PM2 已安装 (${PM2_VERSION})${NC}"
else
    echo -e "${YELLOW}⚠️  PM2 未安装，正在安装...${NC}"
    npm install -g pm2
    echo -e "${GREEN}✅ PM2 安装完成${NC}"
fi

# 检查 Nginx
if command -v nginx &> /dev/null; then
    echo -e "${GREEN}✅ Nginx 已安装${NC}"
else
    echo -e "${RED}❌ Nginx 未安装${NC}"
    echo "请先安装 Nginx："
    echo "  sudo apt-get update"
    echo "  sudo apt-get install -y nginx"
    exit 1
fi

# 检查 .env 文件
if [ -f "${PROJECT_ROOT}/.env" ]; then
    echo -e "${GREEN}✅ .env 文件已配置${NC}"
else
    echo -e "${RED}❌ .env 文件不存在${NC}"
    echo "请先创建 ${PROJECT_ROOT}/.env 文件"
    exit 1
fi

echo ""

##############################################
# 第二步：启动基础服务（Docker）
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}🐳 第二步：启动基础服务（MySQL + Redis）${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

cd "${PROJECT_ROOT}"

echo -e "${YELLOW}正在启动 Docker 基础服务...${NC}"
docker compose -f docker-compose.services.yml up -d

# 等待服务就绪
echo -e "${YELLOW}等待 MySQL 启动...${NC}"
sleep 10

# 检查服务状态
docker compose -f docker-compose.services.yml ps

echo -e "${GREEN}✅ 基础服务启动完成${NC}\n"

##############################################
# 第三步：安装依赖
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}📦 第三步：安装依赖${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

echo -e "${YELLOW}正在安装后端依赖...${NC}"
cd "${BACKEND_DIR}"
pnpm install
echo -e "${GREEN}✅ 后端依赖安装完成${NC}\n"

echo -e "${YELLOW}正在安装前端依赖...${NC}"
cd "${FRONTEND_DIR}"
pnpm install
echo -e "${GREEN}✅ 前端依赖安装完成${NC}\n"

##############################################
# 第四步：构建项目
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}🔨 第四步：构建项目${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

echo -e "${YELLOW}正在构建后端...${NC}"
cd "${BACKEND_DIR}"
pnpm run build
echo -e "${GREEN}✅ 后端构建完成${NC}\n"

echo -e "${YELLOW}正在构建前端...${NC}"
cd "${FRONTEND_DIR}"
pnpm run build
echo -e "${GREEN}✅ 前端构建完成${NC}\n"

##############################################
# 第五步：停止旧服务
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}🛑 第五步：停止旧服务${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

pm2 stop devtools-backend devtools-frontend || true
pm2 delete devtools-backend devtools-frontend || true
echo -e "${GREEN}✅ 旧服务已停止${NC}\n"

##############################################
# 第六步：启动服务
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}🚀 第六步：启动服务（PM2）${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

echo -e "${YELLOW}正在启动后端...${NC}"
cd "${BACKEND_DIR}"
pm2 start ecosystem.config.js
echo -e "${GREEN}✅ 后端启动成功${NC}\n"

echo -e "${YELLOW}正在启动前端...${NC}"
cd "${FRONTEND_DIR}"
pm2 start ecosystem.config.cjs
echo -e "${GREEN}✅ 前端启动成功${NC}\n"

# 保存 PM2 配置
pm2 save
echo -e "${GREEN}✅ PM2 配置已保存${NC}\n"

##############################################
# 第七步：配置 Nginx
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}🌐 第七步：配置 Nginx${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

NGINX_CONF="/etc/nginx/sites-available/${DOMAIN}"

if [ -f "${NGINX_CONF}" ]; then
    echo -e "${GREEN}✅ Nginx 配置已存在${NC}"
else
    echo -e "${YELLOW}正在创建 Nginx 配置（临时 HTTP 配置）...${NC}"
    # 使用纯 HTTP 配置，等 SSL 证书配置好后再切换
    sudo cp "${PROJECT_ROOT}/deploy/nginx/devtoolsnav-http-only.conf" "${NGINX_CONF}"
    sudo ln -sf "${NGINX_CONF}" "/etc/nginx/sites-enabled/${DOMAIN}"
    echo -e "${GREEN}✅ Nginx 配置已创建（HTTP 模式）${NC}"
    echo -e "${YELLOW}⚠️  提示：SSL 证书配置完成后，使用 devtoolsnav-host.conf 替换${NC}"
fi

# 测试 Nginx 配置
sudo nginx -t

# 重载 Nginx
sudo systemctl reload nginx
echo -e "${GREEN}✅ Nginx 已重载${NC}\n"

##############################################
# 第八步：配置 PM2 开机自启
##############################################
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}⚙️  第八步：配置 PM2 开机自启${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"

pm2 startup systemd -u $USER --hp $HOME || true
pm2 save
echo -e "${GREEN}✅ PM2 开机自启已配置${NC}\n"

##############################################
# 部署完成
##############################################
echo -e "${GREEN}"
echo "╔════════════════════════════════════════╗"
echo "║   🎉 部署完成！                        ║"
echo "╚════════════════════════════════════════╝"
echo -e "${NC}"

echo -e "${YELLOW}📊 服务状态：${NC}"
pm2 list

echo ""
echo -e "${YELLOW}📝 查看日志：${NC}"
echo "  应用日志: pm2 logs"
echo "  后端日志: pm2 logs devtools-backend"
echo "  前端日志: pm2 logs devtools-frontend"
echo "  Docker日志: docker compose -f docker-compose.services.yml logs -f"
echo ""
echo -e "${YELLOW}🔄 重启服务：${NC}"
echo "  应用服务: pm2 restart all"
echo "  基础服务: docker compose -f docker-compose.services.yml restart"
echo ""
echo -e "${YELLOW}🌐 访问地址：${NC}"
echo "  http://${DOMAIN}"
echo "  后端API: http://localhost:4002/api/health"
echo "  前端: http://localhost:3002"
echo ""
echo -e "${YELLOW}🐳 Docker 服务：${NC}"
echo "  MySQL: localhost:3307"
echo "  Redis: localhost:6380"
echo ""

